'use strict'
var adminApp = angular.module('adminApp', ['ngAnimate', 'ngSanitize', 'uCommon', 'uBootstrap'])
/**
 * 控制台控制器
 * 定义全局菜单及通用方法
 */
.controller('adminCtrl', ['$scope', '$window', '$http', '$timeout', function($scope, $window, $http, $timeout) {
	// 初始化
	$http.defaults.headers.common.Accept = 'application/json, text/html, text/plain, * / *';
	
	// 定义操作方法
	angular.extend($scope, {
		// 设置所有菜单
		// 仅满足当前样式
		menus: function(menus) {
			$scope.menus = menus;
			$scope.current(menus[0]);
		}, 

		// 设置当前菜单
		current: function(menu) {
			$scope.menu = menu;
		}, 

		// 加载页面
		// 根据地址加载操作区域页面
		load: function(url) {
			$scope.menu = {url: url};
		}, 

		// 判断当前菜单
		// 若是当前菜单则选中
		active: function(menu) {
			return ($scope.menu === menu) ? 'active' : '';
		}, 

		// 页面模式
		// 分为判断和设置
		// 参数为字符串时为设置
		// 参数为字符串数组时为判断
		mode: function(mode) {
			if (angular.isArray(mode)) {
				return (jQuery.inArray($scope.modeName, mode) >= 0);
			} else if (angular.isString(mode)) {
				$scope.modeName = mode;
			} else {
				console.error('mode type undefined.', mode);
			}
		}, 

		// 按钮状态
		// 用以设置并判断按钮当前状态
		// 参数为字符串时为设置
		// 参数为字符串数组时为判断
		btn: function(mode) {
			if (angular.isArray(mode)) {
				return (jQuery.inArray($scope.btnMode, mode) >= 0);
			} else if (angular.isString(mode)) {
				$scope.btnMode = mode;
			} else {
				console.error('button mode type undefined.', mode);
			}
		}, 

		// 判断数据是否为空
		empty: function(data) {
			return (!data || data.length <= 0);
		}, 

		// 分配分页数据
		// 仅配合分页标签使用
		page: function(data, dname, pname) {
			$scope[dname] = data.content;
			$scope[pname || 'pagination'] = { 
				current: data.page, 
				size: data.size, 
				total: data.total, 
				pages: data.totalPage 
			};
		}, 

		// 页面跳转
		// 根据地址将整个页面跳转到目标
		goto: function(url) {
			$window.location.href = url;
		}, 

		// 判断表单输入项是否有数据错误
		// 若存在数据错误则添加样式
		// 样式绑定为 Bootstrap 样式
		hasError: function(field) {
			return (field.$dirty && field.$invalid) ? 'has-error' : '';
		}, 

		// 判断输入项的错误类型
		// 根据错误类型返回 True or False
		isError: function(field, type) {
			return (field.$dirty && field.$error[type]);
		},

		// 更新数组中相应的数据
		// 若找到更新数据返回 true
		// 否则返回 false
		update: function(data, array) {
			var found = false;
			angular.forEach(array, function(v, i) {
				if (v.id === data.id) {
					array.splice(i, 1, data);
					found = true;
					return;
				}
			});
			return found;
		},

		// 从数组找到对应数据并删除
		// 对象与数组内容必须绝对相等
		remove: function(data, array) {
			angular.forEach(array, function(v, i) {
				if (v.id === data.id) {
					array.splice(i, 1);
				}
			});
		}, 

		// 通知警告
		setAlert: function(alert) {
			if (angular.isUndefined($scope.alert)) $scope.alert = {};
			if (angular.isDefined(alert.type)) $scope.alert.type = alert.type;
			if (angular.isDefined(alert.message)) $scope.alert.message = alert.message;
			if (alert.show !== false) $scope.alert.show = true;
			if (angular.isNumber(alert.delay)) {
				$timeout(function() {
					$scope.alert.show = false;
				}, alert.delay);
			}
		}, 

		// 验证数据
		// 若参数为字符串时认定为表单提交验证
		// 否则验证反馈数据，需配合 playframework 的 play.data.validation.Validation 对象使用
		// 仅在当前样式下有效
		// 根据错误提示返回 True or False
		validate: function(data) {
			//TODO 需要重新实现
		}
	});
}])

/**
 * 自定义验证
 * 验证两值是否相等
 */
.directive('vdEquals', [function() {
	return {
		require: 'ngModel',
		link: function($scope, $element, $attrs, $ctrl) {
			$scope.$watch($attrs.ngModel, function(value) {
				$ctrl.$setValidity('equals', (value === $attrs.vdEquals));
			});
		}
	};
}])

/**
 * 单图文信息
 */
.directive('article', ['$compile', function($compile) {
	return {
		restrict: 'A',
		link: function($scope, $element, $attrs) {
			// 初始化
			var bind = $attrs.article,
				autoheight = (angular.isUndefined($attrs.autoheight)) ? '' : 'auto',
			// 定义节点
				tpl = angular.element([
					'<div class="wrap">', 
						'<div class="main">', 
							'<p class="title" ng-show="', bind, '.title">{{', bind, '.title}}</p>', 
							'<p class="time" ng-show="', bind, '.datetime">{{', bind, '.datetime|date:\'yyyy-MM-dd\'}}</p>', 
							'<p class="img ', autoheight, '"><img alt="{{', bind, '.title}}" ng-src="{{', bind, '.picUrl}}"></p>', 
							'<p class="desc" ng-show="', bind, '.description">{{', bind, '.description}}</p>', 
						'</div>', 
						'<div class="ops"></div>', 
					'</div>'].join(''));
			
			// 节点处理
			tpl.find('.ops').html($element.find('a'));
			$element.addClass('article').html($compile(tpl)($scope));
		}
	};
}])

/**
 * 多图文信息
 */
.directive('articleMulti', ['$compile', function($compile) {
	return {
		restrict: 'A',
		link: function($scope, $element, $attrs) {
			// 初始化
			var bind = $attrs.articleMulti,
			// 定义节点
				tpl = angular.element([
					'<div class="wrap">', 
						'<div class="main">', 
							'<p class="title">{{', bind, '.articles[0].title}}</p>', 
							'<p class="img"><img alt="{{', bind, '.articles[0].title}}" ng-src="{{', bind, '.articles[0].picUrl}}"></p>', 
						'</div>', 
						'<ul>', 
							'<li ng-repeat="am in ', bind, '.articles" ng-if="!$first">', 
								'<p class="img"><img alt="{{am.title}}" ng-src="{{am.picUrl}}"></p>', 
								'<span>{{am.title}}</span>', 
							'</li>', 
						'</ul>', 
						'<div class="ops"></div>', 
					'</div>'].join(''));
			
			// 节点处理
			tpl.find('.ops').html($element.find('a'));
			$element.addClass('article multi').html($compile(tpl)($scope));
		}
	};
}])

/**
 * 
 */
.directive('reply', ['$compile', '$http', function($compile, $http) {
	return {
		restrict: 'A',
		priority: -1000,
		terminal: true,
		scope: {type: '@', value: '@', url: '@'},
		link: function($scope, $element, $attrs) {
			// 初始化
			var value = $scope.value.replace(/-/g, '_'),
				tpls = '<div class="fade-animate single" article="article.' + value + '"><div>',
				tplm = '<div class="fade-animate single" article-multi="article.' + value + '"></div>';

			// 判断并处理
			if ($scope.type === '02' || $scope.type === '03') {
				$http({
					method: 'get',
					url: $scope.url + '?type=' + $scope.type + '&id=' + $scope.value,
					headers: {'Content-Type': 'application/x-www-form-urlencoded'}
				}).success(function(data) {
					if (angular.isUndefined($scope.article)) $scope.article = {};
					$scope.article[value] = data;
				});
				$element.html(($scope.type === '02') ? $compile(tpls)($scope) : $compile(tplm)($scope));
			} else {
				$element.html($scope.value);
			}
		}
	};
}])

/**
 * 
 */
.directive('alert', [function() {
	return {
		restrict: 'E',
		replace: true,
		template: '<div class="alert-wx" ng-class="alertClass()"><p ng-bind-html="alert.message"></p></div>',
		link: function($scope, $element, $attrs) {
			$scope.setAlert({show: false});
			$scope.alertClass = function() {
				var className = '';
				if ($scope.alert.show) {
					className += 'alert-wx-show';
				}
				return className + ((angular.isUndefined($scope.alert) || angular.isUndefined($scope.alert.type)) ? '' : ' alert-wx-' + $scope.alert.type);
			}
		}
	};
}]);
